package to4.client;

import java.util.Date;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.DeckPanel;
import com.google.gwt.user.client.ui.RootPanel;

/**
 * Entry point classes define <code>onModuleLoad()</code>.
 */
public class TO4 implements EntryPoint {
	private DeckPanel deckpanel = new DeckPanel();
	private Inlog inlog = new Inlog(this);
	private Wachtwoord wachtwoord = new Wachtwoord(this);
	private Registreren registreren = new Registreren(this);
	private ZonderHome zonderhome = new ZonderHome(this);
	private MetHome methome = new MetHome(this);
	private Menu menuzonder = new Menu(this);
	private MenuMet menumet = new MenuMet(this);
	private boolean heeftEmail;
	AccountServiceAsync myService = (AccountServiceAsync) GWT.create(AccountService.class);
	@Override
	public void onModuleLoad() {
		RootPanel.get("menubar").setVisible(false);
		deckpanel.add(inlog.createPage());
		deckpanel.add(wachtwoord.createPage());
		deckpanel.add(registreren.createPage());
		menuzonder.createMenu();
		menumet.createMenu();
		deckpanel.showWidget(0);
		RootPanel.get("menubar").setVisible(false);
		RootPanel.get("menubarmet").setVisible(false);
		RootPanel.get("container_mid_home").setVisible(false);
		RootPanel.get("container_mid_btm_800").setVisible(false);
		RootPanel.get("wrapper_mid").setVisible(false);


		RootPanel.get("container_mid_reg1").add(deckpanel);
		
		myService.voegMetAutoToe("pietmetdezachteg@limburg.li", "guusmeeuwis", "Piet", "Bier", createGeb(1976, 3, 29), "Bierpad", "33", "6045BI", "Venlo", "Limburg", "023245252", "met auto", "met overnachting", "nee", "wel mee", "Mercedes", "Vito", 8, getProvincieArray(false, false, false, false, false, false, true, false, false, true, false, true) , "Geen commentaar opgegeven",  new AsyncCallback<Boolean>(){
			@Override
			public void onFailure(Throwable caught) {
				Window.alert("Er is een probleem met de server, als dit probleem zich voor blijft doen neem dan contact op met VakantieVibes op het nummer");
			}
			@Override
			public void onSuccess(Boolean result) {
				// TODO Auto-generated method stub
			}
		});
	}

	//Communicatie client to server

	//Inloggen
	public void sendInlog() {
		final String email = inlog.getInlogEmail();
		String pass = inlog.getInlogPassword();
		myService.LogIn(email, pass, new AsyncCallback<Boolean>(){
			@Override
			public void onFailure(Throwable caught) {
				Window.alert("Er is iets mis gegaan met de communicatie, als deze melding zich blijft voordoen neem dan contact op met VakantieVibes");
			}
			@Override
			public void onSuccess(Boolean result) {
				if (result == true){
					AsyncCallback<String> typeInlog = new AsyncCallback<String>() {
						@Override
						public void onFailure(Throwable caught) {
							Window.alert("Het systeem kan niet ontdekken welk type account u heeft" + "\n" + "Probeer het later nog eens");
						}
						@Override
						public void onSuccess(String result) {
							if(result.equals("zonder auto")){
								zonderhome.showHomeZonder(email);
								inlog.setTextBoxtoNull();
								menuzonder.setEmail(email);
							}
							if(result.equals("met auto")){
								inlog.setTextBoxtoNull();
								methome.showHomeMet(email);
								menumet.setEmail(email);
							}
						}
					};
					myService.getTypeAccount(email, typeInlog);
				}
				else {
					Window.alert("Vekeerde e-mail/wachtwoord combinatie");
				}
			}
		});
	}
	//Logt opnieuw in na wijziging datatable
	public void sendInlog(final String email, String pass) {
		System.out.println(email + pass);
		myService.LogIn(email, pass, new AsyncCallback<Boolean>(){
			@Override
			public void onFailure(Throwable caught) {
				Window.alert("Er is iets mis gegaan met de communicatie, als deze melding zich blijft voordoen neem dan contact op met VakantieVibes");
			}
			@Override
			public void onSuccess(Boolean result) {
				if (result == true){
					AsyncCallback<String> typeInlog = new AsyncCallback<String>() {
						@Override
						public void onFailure(Throwable caught) {
							Window.alert("Het systeem kan niet ontdekken welk type account u heeft" + "\n" + "Probeer het later nog eens");
						}
						@Override
						public void onSuccess(String result) {
							if(result.equals("zonder auto")){
								zonderhome.showHomeZonder(email);
								inlog.setTextBoxtoNull();
								menuzonder.setEmail(email);
							}
							if(result.equals("met auto")){
								inlog.setTextBoxtoNull();
								methome.showHomeMet(email);
								menumet.setEmail(email);
							}
						}
					};
					myService.getTypeAccount(email, typeInlog);
				}				
			}
		});
	}

	//maakt account zonder auto aan
	public void voegZonderAutoToe(final String email, String pass, String vrnm, String achternm, Date geboorte, String straat, String nr, String postcode, String woonplaats, String prov, String tel, String type, String reizen, String roken, String fiets){
		myService.voegZonderAutoToe(email, pass, vrnm, achternm, geboorte, straat, nr, postcode, woonplaats, prov, tel, type, reizen, roken, fiets, new AsyncCallback<Boolean>(){
			@Override
			public void onFailure(Throwable caught) {
				Window.alert("Er is iets mis gegaan");
			}
			@Override
			public void onSuccess(Boolean result) {
				if (result == true){
					myService.sendRegisterMail(email, new AsyncCallback<String>(){
						@Override
						public void onFailure(Throwable caught) {
							Window.alert("De bevestiging is niet correct verzonden");
						}
						@Override
						public void onSuccess(String result) {
							showInlog();
							if(result.equals("succes")){
								Window.alert("U bent geregistreerd, binnen enkele minuten ontvangt een bevestiginsemail");
							}
							if(result.equals("faal")){
								Window.alert("E-mail niet succesvol verzonden");
							}
						}
					});
				}
				if (result == false){
					Window.alert("Dit e-mailadres is al geregistreerd");
				}
			}
		});
	}
	//Maakt account met auto aan
	public void voegMetAutoToe(final String mailaddress, String ww, String vrnm, String achtrnm, Date geb, String strnm, String nr, String pstcd, String wnplts, String prvnc, String tlnmr, String tpe, String labreizen, String labroken, String labfiets, String autoMerk, String autoType, int autoPlaatsen, boolean[] provincies, String comment){
		myService.voegMetAutoToe(mailaddress, ww, vrnm, achtrnm, geb, strnm, nr, pstcd, wnplts, prvnc, tlnmr, tpe, labreizen, labroken, labfiets, autoMerk, autoType, autoPlaatsen, provincies, comment, new AsyncCallback<Boolean>(){
			@Override
			public void onFailure(Throwable caught) {
				Window.alert("Er is iets mis gegaan gedurende het registreren");
			}
			@Override
			public void onSuccess(Boolean result) {
				if(result == false){
					Window.alert("Dit e-mailadres is al geregistreerd");
				}
				if(result == true){
					myService.sendRegisterMail(mailaddress, new AsyncCallback<String>(){
						@Override
						public void onFailure(Throwable caught) {
							Window.alert("De bevestiging is niet correct verzonden");
						}
						@Override
						public void onSuccess(String result) {
							showInlog();
							if(result.equals("succes")){
								Window.alert("U bent succesvol geregistreerd, binnen enkele minuten ontvangt een bevestiginsemail");
							}
							if(result.equals("faal")){ 
								Window.alert("U bent succesvol geregistreerd, maar e-mail niet succesvol verzonden");
							}
						}
					});
				}
			}
		});
	}

	//Weergave pagina's
	public void showInlog(){
		deckpanel.showWidget(0);
		RootPanel.get("menubar").setVisible(false);
		RootPanel.get("container_mid_home").setVisible(false);
		RootPanel.get("container_mid_btm_800").setVisible(false);
		RootPanel.get("wrapper_mid").setVisible(false);
		RootPanel.get("menubarmet").setVisible(false);

		RootPanel.get("container_top").setVisible(true);
		RootPanel.get("container_mid_reg1").setVisible(true);
		RootPanel.get("container_btm").setVisible(true);

	}
	public void showWachtwoord(){
		deckpanel.showWidget(1);
		RootPanel.get("menubar").setVisible(false);
		RootPanel.get("container_mid_home").setVisible(false);
		RootPanel.get("container_mid_btm_800").setVisible(false);
		RootPanel.get("wrapper_mid").setVisible(false);
		RootPanel.get("menubarmet").setVisible(false);

		RootPanel.get("container_top").setVisible(true);
		RootPanel.get("container_mid_reg1").setVisible(true);
		RootPanel.get("container_btm").setVisible(true);
	}
	public void showRegistreren(){
		deckpanel.showWidget(2);
		RootPanel.get("menubar").setVisible(false);
		RootPanel.get("container_mid_home").setVisible(false);
		RootPanel.get("container_mid_btm_800").setVisible(false);
		RootPanel.get("wrapper_mid").setVisible(false);
		RootPanel.get("menubarmet").setVisible(false);

		RootPanel.get("container_top").setVisible(true);
		RootPanel.get("container_mid_reg1").setVisible(true);
		RootPanel.get("container_btm").setVisible(true);
	}

	public void showMetHome(String email){
		menumet.setEmail(email);
		RootPanel.get("container_mid_home").setVisible(true);
		RootPanel.get("container_mid_btm_800").setVisible(true);
		RootPanel.get("wrapper_mid").setVisible(true);
		RootPanel.get("menubarmet").setVisible(true);

		RootPanel.get("container_top").setVisible(false);
		RootPanel.get("container_mid_reg1").setVisible(false);
		RootPanel.get("container_btm").setVisible(false);
		RootPanel.get("menubar").setVisible(false);

		RootPanel.get("container_mid_home").clear();
		RootPanel.get("container_mid_home").add(methome.createPage(email));

	}

	public void showZonderHome(String email){
		menuzonder.setEmail(email);
		RootPanel.get("menubar").setVisible(true);
		RootPanel.get("container_mid_home").setVisible(true);
		RootPanel.get("container_mid_btm_800").setVisible(true);
		RootPanel.get("wrapper_mid").setVisible(true);

		RootPanel.get("container_top").setVisible(false);
		RootPanel.get("container_mid_reg1").setVisible(false);
		RootPanel.get("container_btm").setVisible(false);
		RootPanel.get("menubarmet").setVisible(false);

		RootPanel.get("container_mid_home").clear();
		RootPanel.get("container_mid_home").add(zonderhome.createPage(email));
	}

	public Date createGeb(int jr, int mnd, int dag){
		Date geb = new Date();
		geb.setDate(dag);
		geb.setYear(jr);
		geb.setMonth(mnd);
		return geb;
	}

	//Maakt array aan van provincies voor voorgefinieerde accounts
	public boolean[] getProvincieArray(boolean a, boolean b, boolean c, boolean d, boolean e, boolean f, boolean g, boolean h, boolean i, boolean j, boolean k, boolean l){
		boolean [] ar = new boolean[12];
		if(a == true){
			ar[0] = true;
		}
		if (a == false){
			ar[0] = false;
		}
		if(b == true){
			ar[1] = true;
		}
		if (b == false){
			ar[1] = false;
		}
		if(c == true){
			ar[2] = true;
		}
		if (c == false){
			ar[2] = false;
		}
		if(d == true){
			ar[3] = true;
		}
		if (d == false){
			ar[3] = false;
		}
		if(e == true){
			ar[4] = true;
		}
		if (e == false){
			ar[4] = false;
		}
		if(f == true){
			ar[5] = true;
		}
		if (f == false){
			ar[5] = false;
		}
		if(g == true){
			ar[6] = true;
		}
		if (g == false){
			ar[6] = false;
		}
		if(h == true){
			ar[7] = true;
		}
		if (h == false){
			ar[7] = false;
		}
		if(i == true){
			ar[8] = true;
		}
		if (i == false){
			ar[8] = false;
		}
		if(j == true){
			ar[9] = true;
		}
		if (j == false){
			ar[9] = false;
		}
		if(k == true){
			ar[10] = true;
		}
		if (k == false){
			ar[10] = false;
		}
		if(l == true){
			ar[11] = true;
		}
		if (l == false){
			ar[11] = false;
		}
		return ar;
	}

	//Controle of email-adres al geregistreerd staat
	public boolean heeftInlog(String email){
		myService.heeftInlog(email, new AsyncCallback<Boolean>(){
			@Override
			public void onFailure(Throwable caught) {
				// TODO Auto-generated method stub
			}
			@Override
			public void onSuccess(Boolean result) {
				if(result == true){
					heeftEmail = true;
				}
				if(result == false){
					heeftEmail = false;
				}
			}
		});
		return heeftEmail;
	}

	//wachtwoord verzenden als je hem vergeten bent
	public void sendPassWordmail() {
		String s = wachtwoord.getEmailad();
		myService.sendPassWordmail(s, new AsyncCallback<String>(){
			@Override
			public void onFailure(Throwable caught) {
				Window.alert("Er is iets mis gegaan met de communicatie, als deze melding zich blijft voordoen neem dan contact op met VakantieVibes");
			}
			@Override
			public void onSuccess(String result) {
				if(result.equals("Succes")){
					Window.alert("Wachtwoord succesvol verzonden");
				}
				if(result.equals("faal")){
					Window.alert("Uw wachtwoord is niet correct verzonden, probeer het nog eens");
				}
			}
		});
	}

}